package com.hsoft.zhxy.common.util;

import java.util.Date;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.UUID;

import org.apache.commons.lang3.StringUtils;

/**
 * All rights Reserved, Designed By 哈尔滨工业大学软件工程股份有限公司
 * 
 * @Title:        UUIDGenerator
 * @Description:  获取32位UUID随机码
 *         UUID含义是通用唯一识别码 (Universally Unique Identifier)， 这
 *         是一个软件建构的标准，也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境
 *         (Distributed Computing Environment, DCE) 领域的一部分。
 *         UUID 的目的，是让分布式系统中的所有元素，都能有唯一的辨识资讯，
 *         而不需要透过中央控制端来做辨识资讯的指定。如此一来，每个人都可以建立不与其它人冲突的 UUID。
 *         在这样的情况下，就不需考虑数据库建立时的名称重复问题。 目前最广泛应用的 UUID，即是微软的 Microsoft's Globally
 *         Unique Identifiers (GUIDs)， 而其他重要的应用，则有 Linux ext2/ext3 档案系统、LUKS
 *         加密分割区、GNOME、KDE、Mac OS X 等等。
 * @author: menglingwei
 * @date:   2020年5月16日 下午11:53:44
 */
public class UUIDUtils {

    public UUIDUtils() {
    }

    /**
     * 获取32位UUID
     * @return
     */
    public static String getUUID() {

        UUID uuid = UUID.randomUUID();
        
        String str = uuid.toString();
        str = StringUtils.remove(str, "-");

        return str;
    }
    
    /**
     * 获取16位UUID,前8位为时间戳，后8为UUID中随机抽取的8个字符串
     * @return
     */
    public static String getUUID_16() {
        
        String sources = getUUID();
        Random rand = new Random();
        StringBuffer flag = new StringBuffer();
        for (int j = 0; j < 8; j++) {
            flag.append(sources.charAt(rand.nextInt(9)) + "");
        }
        
        return getUUID_8() + flag.toString();
    }
    
    /**
     * 获取8位UUID,通过时间戳获取。适用于短信验证码，或单台机器的8位随机数
     * @return
     */
    public static String getUUID_8() {
        long l = new Date().getTime();
        return Integer.toHexString((int)l);
    }

    /**
     * 测试
     */
    public static void main(String[] args) {
        
        // 调用方法示例
        String str = getUUID_16();
        System.out.println("=====>>>    " + str);
        
        
        // 单机重复率测试
        int i = 0;
        Set<String> s = new HashSet<String>();
        long startTime = System.currentTimeMillis(); 
        while (true) {
            
            String str2 = getUUID_16();
            if(s.contains(str2)) {
                
                s.add(str2);
                
                System.out.println("======>>>>> 出现重复字符串，当前循环次数为:   " + i);
            }
            i++;
            
            if(i==1000 || i==10000 || i==100000 || i==1000000 || i==10000000 || i==100000000 || i==1000000000) {
                System.out.println("============================");
                System.out.println("当前循环次数为:   " + i);
                long endTime = System.currentTimeMillis();
                System.out.println("程序运行时间：" + (endTime - startTime) + "ms");
            }
            if(i==1000000000) {
                break;
            }
            
        }
    }

}